/**
 * DAOUtilisateur.java    06/04/2012
 */

package l3.info.Projet.Serveur;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import l3.info.Projet.Client.Message;
import l3.info.Projet.Client.Utilisateur;
import l3.info.Projet.Utilitaires.Configuration;
import l3.info.Projet.Utilitaires.DialogueBD;

/**
 * Permet d'accéder à la base de données ayant pour relation
 * un Utilisateur
 * @author Loïc Martinez
 * @version 1.0
 */

public class DAOUtilisateur {

    /** Permet de charger la configuration de la base de données */
    private static Configuration conf = new Configuration(
            "configServer.properties");

    /** La connexion à la base de données */
    private static Connection conn = null;

    /**
     * Constructeur par défaut
     */
    public DAOUtilisateur() {
        conn = conn == null ? DialogueBD.connexionSQL(
                "jdbc:postgresql://localhost"
                        + (conf.valueOf("port").equals("") ? "" : ":")
                        + conf.valueOf("port")
                        + "/" + conf.valueOf("database"),
                        conf.valueOf("user"), conf.valueOf("password"))
                        : conn;
    }

    /**
     * Permet de savoir si l'utilisateur existe, si oui, on passe
     * la variable "connexion du user à true, sinon, elle reste à false
     * @param conn, la connexion à la base de données
     * @param user, l'Utilisateur
     * @param table, la table SQL
     */
    public boolean getExistingUserTable(Utilisateur user,
            String table) {

        // Si = 1, l'utilisateur existe, sinon non
        String requete = "SELECT COUNT(numUtilisateur) AS number FROM " + table
                + " WHERE numUtilisateur = " + user.getId()
                + " AND MotDePasse = '" + user.getMdp() + "';";

        try {
            // Exécution de la requête
            Statement state = conn.createStatement();
            ResultSet result = state.executeQuery(requete);
            // ResultSetMetaData result = state.executeQuery(requete);

            // Un résultat trouvé
            if (result.next()) {
                // number = 1 ? utilisateur trouvé
                if (result.getInt("number") == 1) {

                    // Problème : Ne prends pas effet
                    user.setConnexion(true);

                    result.close();
                    state.close();

                    return true;
                }
            }

            result.close();
            state.close();

            return false;

        } catch (Exception e) {
            System.err.println("Erreur lors de la récupération des données !");
        }
        return false;
    }

    /**
     * Permet d'avoir toutes les données sur l'utilisateur user
     * @param conn, la connexion à la base de données
     * @param user, l'utilisateur
     * @param tableUser, la table des utilisateurs
     * @param tableMessage, la table des messages
     */
    public Utilisateur getDataFromUserTableWhenConnected(Utilisateur user,
            String tableUser, String tableSuivi) {

        String requete = "SELECT numUtilisateur, nomUtilisateur FROM " +
                tableUser + " WHERE numUtilisateur = " + user.getId() + ";";
        try {
            // Exécution de la requête
            Statement state = conn.createStatement();
            ResultSet result = state.executeQuery(requete);

            // On a trouvé la ligne
            // On met à jour le user avec toutes ses données
            if (result.next()) {
                user.setPseudo(result.getString("nomUtilisateur"));
                user.setUtilisateurSuivi(getDataFromSuiviTable(user.getId(),
                        tableSuivi, tableUser));
            }

            result.close();
            state.close();

        } catch (Exception e) {
            System.err.println("Erreur lors de la récupération des données !");
        }
        return user;
    }

    /**
     * Permet de récupérer les NumUtilisateur et le nomUtilisateur
     * des personnes suivies
     * @param numUtilisateur, le numéro d'utilisateur
     * @param tableSuivi, la table du suivi
     * @param tableUtilisateur, la table d'utilisateur
     * @return une hashMap ayant pour clé le numUtilisateur suivi
     *         et comme value le pseudo associé
     */
    public Map<Integer, String> getDataFromSuiviTable(int numUtilisateur,
            String tableSuivi, String tableUtilisateur) {

        Map<Integer, String> utilisateurSuivi =
                new HashMap<Integer, String>();

        String requete = "SELECT nomutilisateur, numutilisateur "
                + "FROM " + tableSuivi + " "
                + "JOIN " + tableUtilisateur + " "
                + "ON numecrivain = numutilisateur "
                + "WHERE numlecteur = " + numUtilisateur + ";";

        try {
            // Exécution de la requête
            Statement state = conn.createStatement();
            ResultSet result = state.executeQuery(requete);

            // Tant qu'on trouve des n-uplets
            while (result.next()) {
                // On ajoute la ligne à la List final
                utilisateurSuivi.put(result.getInt("numutilisateur"),
                        result.getString("nomutilisateur"));
            }

            result.close();
            state.close();

        } catch (Exception e) {
            System.err.println("Erreur lors de la récupération des données !");
        }

        return utilisateurSuivi;
    }
}
